import random

from django.http import HttpResponse
from django.shortcuts import render
from django_redis import get_redis_connection
from rest_framework.response import Response

from rest_framework.views import APIView

from libs.captcha.captcha import captcha
from libs.yuntongxun.yuntongxun.sms import CCP
from users.serializer import RegisterSMSCodeSerializer

#短信验证码
class RegisterSMSCodeView(APIView):
    """
    获取短信验证码
    GET /verifications/smscodes/(?P<mobile>1[345789]\d{9})/?text=xxxx&image_code_id=xxxx
    获取短信验证码,首先需要校验 验证码

    思路:
    创建序列化器,定义text 和 image_code_id
    redis 判断该用户是否频繁获取
    生成短信验证码
    redis增加记录
    发送短信
    返回响应
    """
    def get(self,request,mobile):
        #1.获取参数   手机号  用户输入图片验证码 前端UUID
        query_params = request.query_params
        #2.检验参数
        serializer = RegisterSMSCodeSerializer(data = query_params)
        serializer.is_valid(raise_exception = True)
        #3.生成短信
        sms_code = '%06d' %random.randint(0,999999)
        print(sms_code)
        #保存到redis增加记录
        redis_conn = get_redis_connection('code')
        redis_conn.setex('sms_'+mobile,5*60,sms_code)
        # 发送短信
        from celery_tasks.sms.tasks import send_sms_code
        send_sms_code.delay(mobile,sms_code)
        # 返回响应
        return Response({'msg':'ok'})






#图片验证码  GET 方法    GET /verifications/imagecodes/(?P<image_code_id>.+)/
class RegisterImageCodeView(APIView):
    """
    创建图片和验证码
    通过redis进行保存验证码,需要在设置中添加 验证码数据库选项
    将图片返回
    """
    #1.创建图片和验证码
    def get(self,request,image_code_id):
        text,img = captcha.generate_captcha()
    #2.通过redis进行保存验证码,设置时间。需要在设置中添加 验证码数据库选项
    #2.1.开启redis
        redis_conn = get_redis_connection('code')
    #保存
        redis_conn.setex('img_%s' %image_code_id,60,text)
        return HttpResponse(img,content_type='image/jpeg')


